package com.main.dao;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.generico.base.BaseDaoImpl;
import com.generico.exception.AsiWebException;
import com.main.java.Compra;
import com.main.java.DocumentoAdjunto;


@Repository
public class CompraDaoImpl extends BaseDaoImpl implements CompraDao {
	
	
	private static final String SUCCESS = "success";
	private static final String FAILURE = "failure";
	private static final String MESSAGE = "message";

	@Autowired
	private SessionFactory sessionFactory;

	private Session openSession() {
		return sessionFactory.getCurrentSession();
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> getAllActivesAsArray() {
		Criteria criteria = openSession().getSessionFactory().getCurrentSession().createCriteria(Compra.class);
		criteria.createAlias("usuario","usuario");
		criteria.createAlias("ctgProveedor","ctgProveedor");
//		criteria.createAlias("ctgProductoTamanio","ctgProductoTamanio", JoinType.LEFT_OUTER_JOIN);
//		criteria.createAlias("ctgProductoGarantia","ctgProductoGarantia", JoinType.LEFT_OUTER_JOIN);
		criteria.setProjection(Projections.projectionList().
				add(Projections.property("compraId")).
				add(Projections.property("compraFecha")).
				add(Projections.property("compraTotal")).
				add(Projections.property("compra_imagen")).
				
				add(Projections.property("usuario.id")).
				add(Projections.property("usuario.login")).
				
				add(Projections.property("ctgProveedor.ctgProveedorId")).
				add(Projections.property("ctgProveedor.ctgProveedorNombre")).
				add(Projections.property("ctgProveedor.ctgProveedorDireccion"))
				
				);
//		criteria.add(Restrictions.eq("ctgProductoActivo", "1"));
		criteria.addOrder(Order.asc("compraId"));
		try {
			return (List<Object[]>) findByCriteria(criteria);
		} catch (AsiWebException e) {
			logger.error(e, e);
			return Collections.emptyList();
		}
	}
	
	public Map<String, Object> guardarCompra (Compra compra, Long UploadMaxSize, CommonsMultipartFile uploadFile) throws AsiWebException{
		
		Map<String, Object> result = new HashMap<String, Object>();
		if(UploadMaxSize > 0 && uploadFile.getSize() > UploadMaxSize){
			result.put(MESSAGE, "Tama\u00F1o de Archivo excede el m\u00E1ximo permitido");
			result.put(FAILURE, true);
			return result;
		}
		int dot = StringUtils.lastIndexOf(uploadFile.getOriginalFilename(), ".");
		String extension = (dot != -1) ? StringUtils.substring(uploadFile.getOriginalFilename(), dot + 1) : "";

		compra.setCompra_imagen(uploadFile.getBytes());
		if(compra.getCompraId() != null && compra.getCompraId() > 0) update(compra);
		else save(compra);
		return result;
	}

	public void eliminarCompra (Long compraId) throws AsiWebException{
		String hql = "delete from CompraId where compraId= :compraId";
		openSession().getSessionFactory().getCurrentSession().createQuery(hql).setLong("compraId", compraId).executeUpdate();
	}
	
	public Compra findByCompraId (Long compraId) throws AsiWebException{
		Compra compra = new Compra();
		compra = (Compra) findById(Compra.class, compraId);
		return compra;
	}
	
	@SuppressWarnings("unchecked")
	public List<Compra> getCtgCompras(Long compraId) {
		List<Compra> lista = Collections.emptyList();
		Criteria criteria = openSession().getSessionFactory().getCurrentSession().createCriteria(Compra.class);
		criteria.add(Restrictions.eq("compraId", compraId));
		try {
			lista = (List<Compra>) findByCriteria(criteria);
		} catch (AsiWebException e) {
			logger.error("Error obteniendo registros de Compra: " + e.getMessage(), e);
		}
		return lista;
	}
	
	public List<Compra> getRecords(Long id) {
		List<Compra> lista = Collections.emptyList();
		Criteria criteria = openSession().getSessionFactory().getCurrentSession().createCriteria(Compra.class);
		criteria.add(Restrictions.eq("compraId", id));
		try {
			lista = (List<Compra>) findByCriteria(criteria);
		} catch (AsiWebException e) {
			logger.error("Error obteniendo registros de Compra digitalizados: " + e.getMessage(), e);
		}
		return lista;
	}
}
